package com.itheima.xmy.Demo.Demo03;

import java.lang.reflect.Field;

/*
> 使用反射技术实现。 使用Field对象给成员变量赋值、取值*/
public class Demo03 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Student student = new Student("张三", 15);

        setProperty(student,"name","李四" );
        System.out.println(student);
        Object name = getProperty(student, "age");
        System.out.println(name);

    }

/*写一个方法，此方法可将obj对象中名为propertyName的属性的值设置为value.

- Object  obj  ：  对象 （实例化的对象）
- String  propertyName ： 属性名（成员变量名）
- Object  value ： 属性值（成员变量的数据值）
- 方法的功能： 给obj对象中的propertyName属性，赋值为value*/
    public static void setProperty(Object obj, String propertyName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Class<?> aClass = obj.getClass();
        Field propertyName1 = aClass.getDeclaredField(propertyName);
        propertyName1.setAccessible(true);
        propertyName1.set(obj, value);
    }

    /*2. 写一个方法，此方法可以获取obj对象中名为propertyName的属性的值
   `public Object getProperty(Object obj, String propertyName){}`
   - Object  obj ： 对象 （实例化的对象）
   - String  propertyName ： 属性名（成员变量名）*/
    public static Object getProperty(Object obj, String propertyName) throws NoSuchFieldException, IllegalAccessException {
        Class aClass = obj.getClass();
        Field name = aClass.getDeclaredField(propertyName);
        name.setAccessible(true);
        Object o = name.get(propertyName);
        return name.get(obj);
    }
}


